public class code02 {
    public List<String> letterCombinations(String digits) {
        // 观察题目，就会发现，每一个数字下都对应着字符串
        // 对此，可以使用 hash 表将两者的关系关联起来

        // 首先创建出一个顺序表，用来存储返回字段的信息
        List<String> re = new ArrayList<String>();

        if(digits.length() == 0) {
            return re;
        }

        HashMap<Character, String> phone = new HashMap<>();
        phone.put('2', "abc");
        phone.put('3', "def");
        phone.put('4', "ghi");
        phone.put('5', "jkl");
        phone.put('6', "mno");
        phone.put('7', "pqrs");
        phone.put('8', "tuv");
        phone.put('9', "wxyz");

        // 通过外部实现一个函数，对数字进行分析
        function(re, phone, digits, 0, new StringBuffer());
        return re;
    }

    private void function(List<String> re, HashMap<Character, String> phone, String digits, int index, StringBuffer compose) {
        if(index == digits.length()) {
            re.add(compose.toString());
        } else {
            // 通过 index 下标获取到对应的 hash 值
            char digit = digits.charAt(index);
            String lettrt = phone.get(digit);
            int letterLen = lettrt.length();
            for(int i = 0; i < letterLen; i++) {
                // 对于对应的 字符串 进行拼接
                compose.append(lettrt.charAt(i));
                // 实现回溯再次进行计算拼接
                function(re, phone, digits, index + 1, compose);
                compose.deleteCharAt(index);
            }
        }
    }
}
